package org.xx.armory.rpc.routing;

import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

/**
 * 路由数据。
 *
 * @author Dev
 * @see Route
 * @see RouteTable
 */
public final class RouteData
        implements Map<String, String> {
    private final TreeMap<String, String> innerData;
    private final Route route;

    /**
     * 构造路由数据实例。
     *
     * @param route
     *         关联的路由, 如果路由数据只用于表示缺省值或者限制条件, 那么可以不关联任何路由。
     */
    public RouteData(final Route route) {
        this.innerData = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
        this.route = route;
    }

    /**
     * 获取关联的路由。
     *
     * @return 关联的路由。
     */
    public Route getRoute() {
        return this.route;
    }

    /**
     * 根据键获取对应的值。
     *
     * @param key
     *         键名。
     * @param default_
     *         缺省值。
     * @return 对应的值, 如果找不到键名则返回缺省值。
     */
    public String get(
            String key,
            String default_
    ) {
        String v = innerData.get(key);
        return v == null ? default_ : v;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public int size() {
        return innerData.size();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean isEmpty() {
        return innerData.isEmpty();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean containsKey(Object key) {
        return innerData.containsKey(key);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean containsValue(Object value) {
        return innerData.containsValue(value);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public String get(Object key) {
        final String ret = innerData.get(key);
        return ret != null ? ret : "";
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public String put(
            final String key,
            final String value
    ) {
        return innerData.put(key, value);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public String remove(final Object key) {
        return innerData.remove(key);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void putAll(final Map<? extends String, ? extends String> map) {
        innerData.putAll(map);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void clear() {
        this.innerData.clear();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public Set<String> keySet() {
        return innerData.keySet();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public Collection<String> values() {
        return innerData.values();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public Set<Entry<String, String>> entrySet() {
        return innerData.entrySet();
    }

}
